#ifndef frmTree_H
#define frmTree_H

#include "svl_TCommand.h"
#include "frm_TMenu.h"
#include "frm_control_TTable.h"
#include "frm_control_TString.h"
#include "odbTree.h"

namespace frmTree {

///////////////////////////////////////////////////////////////////////////////

struct TStyles : public frm::TTableOfStyles
{
  svl::TString SPath;
  grf::TImageGdiP BmpPlus,BmpMinus,BmpNone;
  //
  TStyles();
};

///////////////////////////////////////////////////////////////////////////////

struct TParam 
{
  odb::TConnect &Connect;
  //
  TParam(odb::TConnect &Connect_) : Connect(Connect_) {}
};

///////////////////////////////////////////////////////////////////////////////

struct TTable : public frm::control::TTable
{
  TParam &Param;
  //
  TTable(frm::control::TWindow &Window,TParam &Param);
};

///////////////////////////////////////////////////////////////////////////////

struct TName : public frm::control::TString
{
  TTable      &Table;
  svl::TString TableName;
  int          RecordId;
  bool         IsUpdate;
  //
  TName(TTable &Table);
 ~TName();
  //
  virtual bool UpdateValue(svl::TString V);
  virtual void TComponent_FocusExit();
};

///////////////////////////////////////////////////////////////////////////////

struct TInfo : public frm::control::TString
{
  TTable &Table;
  //
  TInfo(TTable &Table);
  //
  virtual bool TComponent_FocusEnable() { return false;}
};

///////////////////////////////////////////////////////////////////////////////

struct TRow : public frm::control::TRow
{
  TTable &Table;
  int     RecordId;
  TName  *Name;
  //
  svl_Type(frm::control::TRow)
  TRow(TTable &Table);
  //
  virtual void UpdateExpand(bool V);
  virtual void TComponent_Mouse(frm::control::TMouse Mouse);
};

///////////////////////////////////////////////////////////////////////////////

struct TRowEmpty : public TRow
{
  TRowEmpty(TTable &Table);
};

///////////////////////////////////////////////////////////////////////////////

struct TRowFolderRecord : public TRow
{
  TRowFolderRecord(TTable &Table);
};

///////////////////////////////////////////////////////////////////////////////

struct TRowTableRecord : public TRow
{
  TRowTableRecord(TTable &Table);
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

struct TCmdLoadChildren : public svl::TCommand
{
  TRow                 &ParentRow;
  odbTree::TGetChildren GetChildren;
  //
  TCmdLoadChildren(TRow &ParentRow);
  //
  virtual bool TCommand_GetEnable() { return true;}
  virtual void TCommand_Execute();
};

///////////////////////////////////////////////////////////////////////////////

struct TCmdDeleteRow : public svl::TCommand
{
  TRow &Row;
  //
  TCmdDeleteRow(TRow &Row);
  //
  virtual bool TCommand_GetEnable();
  virtual void TCommand_Execute();
};

///////////////////////////////////////////////////////////////////////////////
// Folder /////////////////////////////////////////////////////////////////////

struct TCmdAddChildFolderFirst : public svl::TCommand
{
  TRow &ParentRow;
  //
  TCmdAddChildFolderFirst(TRow &ParentRow);
  virtual bool TCommand_GetEnable() { return !ParentRow.HasChildren(); }
  virtual void TCommand_Execute();
};

///////////////////////////////////////////////////////////////////////////////

struct TCmdAddFolderBefore : public svl::TCommand
{
  TRow &CurrRow;
  //
  TCmdAddFolderBefore(TRow &CurrRow);
  virtual bool TCommand_GetEnable();
  virtual void TCommand_Execute();
};

///////////////////////////////////////////////////////////////////////////////

struct TCmdAddFolderAfter : public svl::TCommand
{
  TRow &CurrRow;
  //
  TCmdAddFolderAfter(TRow &CurrRow);
  virtual bool TCommand_GetEnable();
  virtual void TCommand_Execute();
};

///////////////////////////////////////////////////////////////////////////////
}

#endif
